fn main() {
    //在变量绑定了但是不使用的时候,可以使用下划线移除警告
    let _a = 1;
    //变量的解构
    // let (a, mut b): (bool, bool) = (true, true);
    let (a, mut b) = (true, true);
    // a = true,不可变; b = false，可变
    println!("a = {:?}, b = {:?}", a, b);
    b = true;
    assert_eq!(a, b);

    //我们可以使用结构式赋值,在这里先声明
    let (a, b, c, d, e);
    //对变量a和b进行赋值
    (a, b) = (1, 2);
    // _ 代表匹配一个值，但是我们不关心具体的值是什么，因此没有使用一个变量名而是使用了 _ ,..表示匹配任意长度的值
    [c, .., d, _] = [1, 2, 3, 4, 5];
    //结构体赋值,将结构体中的值单独提取出去
    Struct { e, .. } = Struct { e: 5 };

    assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);


    //常量,跟kotlin中一样,声明就是不可变,并且在编译的时候就已经确定的,必须指定类型
    const MAX_POINTS: u32 = 100_000;


    //变量的遮蔽
    let z = 1;
    //下面的变量会遮蔽掉上面的同名变量,需要注意的是这不是重新赋值,而是一个全新的名称,全新的内存地址,只不过跟之前的名称重复了所以前面的被遮蔽掉了
    let z = "1";
    {
        //遮蔽掉以前声明的
        let z = 1f32;
    }
    //代码块结束以后会重见天日,被遮蔽的z重新赋值为浮点数,此时他又变成了字符串

    let one_million: i64 = 1_000_000;
    println!("{}", one_million.pow(2));


    let a = (1, "1");
    let b = a;
    println!("{:?}", a);
    println!("{:?}", b);
}
struct Struct {
    e: i32
}